const path = require('path');
var webpack = require('webpack');

module.exports = {
  mode: "development", // "production" | "development" | "none"
  // Chosen mode tells webpack to use its built-in optimizations accordingly.

  entry: {
    app:"./src/app/index.js"
  },
  output: {
    // options related to how webpack emits results

    path: path.resolve(__dirname, "dist"), // string
    // the target directory for all output files
    // must be an absolute path (use the Node.js path module)

    filename: "[name].bundle.js", // string
    // the filename template for entry chunks

    publicPath: "/assets/", // string
    // the url to the output directory resolved relative to the HTML page

    library: "MyLibrary", // string,
    // the name of the exported library

    libraryTarget: "umd", // universal module definition
    // the type of the exported library

    /* Advanced output configuration (click to show) */
  },

  module: {
    // configuration regarding modules

    rules: [
      // rules for modules (configure loaders, parser options, etc.)
      {
        test: /\.js$/,
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: 'babel-loader',
        //   options: {
        //     presets: ['babel-preset-env']
        //   }
        }
      },
      {
        test: /\.jsx?$/,
        include: [
          path.resolve(__dirname, "src/app")
        ],
        exclude: [
          path.resolve(__dirname, "node_modules")
        ],
        loader: "babel-loader",
        options: {
          presets: ["babel-preset-react"]
        },
        // options for the loader
      },
      {
        test: /\.tsx?$/,
        include: [
          path.resolve(__dirname, "src/app")
        ],
        exclude: [
          path.resolve(__dirname, "node_modules")
        ],
        loader: "awesome-typescript-loader"     
      },
      {
        test: /\.ts?$/,
        include: [
          path.resolve(__dirname, "src/app")
        ],
        exclude: [
          path.resolve(__dirname, "node_modules")
        ],
        loader: "awesome-typescript-loader"     
      },

      {
        test: /\.html$/,
        use: [
          // apply multiple loaders and options
          "htmllint-loader",
          {
            loader: "html-loader",
            options: {
              /* ... */
            }
          }
        ]
      },
      
    ],

    /* Advanced module configuration (click to show) */
  },

  resolve: {
    // options for resolving module requests
    // (does not apply to resolving to loaders)

    // modules: [
    //   "node_modules",
    //   path.resolve(__dirname, "src")
    // ],
    // directories where to look for modules

    extensions: [".js", ".json", ".jsx", ".css", "ts" , "tsx"],
    // extensions that are used

    // alias: {
    //   // a list of module name aliases

    //   "module": "new-module",
    //   // alias "module" -> "new-module" and "module/path/file" -> "new-module/path/file"

    //   "only-module$": "new-module",
    //   // alias "only-module" -> "new-module", but not "only-module/path/file" -> "new-module/path/file"

    //   "module": path.resolve(__dirname, "app/third/module.js"),
    //   // alias "module" -> "./app/third/module.js" and "module/file" results in error
    //   // modules aliases are imported relative to the current context
    // },
    /* alternative alias syntax (click to show) */

    /* Advanced resolve configuration (click to show) */
  },

  performance: {
    hints: "warning", // enum
    maxAssetSize: 2000000, // int (in bytes),
    maxEntrypointSize: 4000000, // int (in bytes)
    assetFilter: function(assetFilename) {
      // Function predicate that provides asset filenames
      return assetFilename.endsWith('.css') || assetFilename.endsWith('.js');
    }
  },

  devtool: "source-map", // enum
  // enhance debugging by adding meta info for the browser devtools
  // source-map most detailed at the expense of build speed.

  context: __dirname, // string (absolute path!)
  // the home directory for webpack
  // the entry and module.rules.loader option
  //   is resolved relative to this directory

  target: "web", // enum
  // the environment in which the bundle should run
  // changes chunk loading behavior and available modules

  // externals: ["react","reactDOM"],
  // Don't follow/bundle these modules, but request them at runtime from the environment

  stats: "errors-only",
  // lets you precisely control what bundle information gets displayed

  devServer: {
    // proxy: { // proxy URLs to backend development server
    //   '/api': 'http://localhost:3000'
    // },
    contentBase: path.join(__dirname, 'dist'), // boolean | string | array, static file location
    compress: true, // enable gzip compression
    historyApiFallback: true, // true for index.html upon 404, object for multiple paths
    hot: true, // hot module replacement. Depends on HotModuleReplacementPlugin
    https: false, // true for self-signed, object for cert authority
    noInfo: true, // only errors & warns on hot reload
    port:3001,
    bonjour: true,
    // watchContentBase: true,
    // watchOptions: {
    //     poll: true
    // }
  },
  watch: true,
  watchOptions: {
    ignored: /node_modules/,
    aggregateTimeout: 300,
    poll: 1000
  },

  plugins: [
    // new webpack.HotModuleReplacementPlugin()
  ],
  // list of additional plugins


  /* Advanced configuration (click to show) */
}